package tp.pr5.mv.command;

import tp.pr5.mv.CPU;
import tp.pr5.mv.Memory;
import tp.pr5.mv.OperandStack;
import tp.pr5.mv.ProgramCounter;

public class STEPS extends Command {

	private int param; // Atributo que guarda el parámetro de este comando

	public boolean executeCommand(Memory mem, OperandStack stack,
			ProgramCounter pc, CPU cpu) {

		int i = 0;
		boolean ok = true;
		STEP step = new STEP();

		while (ok && !cpu.isHalted() && i < this.param) { // La idea es ejecutar n veces el comando step, 
			//siempre y cuando la máquina no esté parada y la ejecución de instrucciones haya ido de forma correcta

			if (!step.executeCommand(mem, stack, pc, cpu)) // Ejecutamos un step y comprobamos si la ejecución ha ido bien
				ok = false;
			else
				i++;

		}

		return ok;

	}

	public STEPS() { // Constructor por defecto
		this.param = 0;
	}

	public STEPS(int param) { // Constructor con un parámetro

		this.param = param;
	}

	public Command parse(String line) { // Parse similar al de la clase InstructionParser

		line = line.trim();
		String[] words = line.split(" +");

		if (words[0].equalsIgnoreCase("step") && words.length == 2) {

			int param = Integer.parseInt(words[1]);
			return new STEPS(param);
		}

		else
			return null;

	}

}
